﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using Classes.Conec;
using Classes.Model.Entidade;

namespace Classes.Model.Dao
{
    public class EventoDAO
    {
        private const String SQL_INSERT = 
            "INSERT INTO EVENTOS (NOME,DESCRICAO,LOCAL,HORARIO,PROGRAMACAO,RESPONSAVEL"
            +",TELEFONE,EMAIL,SITE,LOGOMARCA,VALOR,CLASSIFICACAO_ID,CATEGORIA_ID,GENERO_ID,STATUS_ID,CIDADE_ID,PONTUACAO_PRE,"
            +"PONTUACAO_POS,DATA_FINAL,DATA_INICIO) VALUES (@NOME,@DESCRICAO,@LOCAL,@HORARIO,@PROGRAMACAO,@RESPONSAVEL,"
            +"@TELEFONE,@EMAIL,@SITE,@LOGOMARCA,@VALOR,@CLASSIFICACAO_ID,@CATEGORIA_ID,@GENERO_ID,@STATUS_ID,@CIDADE_ID,"
            +"@PONTUACAO_PRE,@PONTUACAO_POS,@DATA_FINAL,@DATA_INICIO)";

        //private const String SQL_UPDATE = "UPDATE STATUS SET DESCRICAO = @NOVA_DESCRICAO WHERE (ID_STATUS = @ID_NOVA)";
        private const String SQL_DELETE = "DELETE EVENTOS WHERE ID_EVENTO = @ID";
        private const String SQL_SELECT_ID = "SELECT * FROM EVENTOS WHERE ID_EVENTO = @ID";
        private const String SQL_SELECT_EVENTOS_BY_USER = "SELECT E.ID_EVENTO, NOME,LOGOMARCA FROM EVENTOS E JOIN USUARIO_PESSOA_EVENTO UPE ON UPE.ID_EVENTO = E.ID_EVENTO WHERE UPE.ID_USUARIO_PESSOA = @ID_USUARIO";
        private const String SQL_SELECT = "SELECT * FROM EVENTOS";
        private const String SQL_INSERT_COMENTARIO = "INSERT INTO USUARIO_PESSOA_EVENTO_COMENTARIO(COMENTARIO, ID_USUARIO_PESSOA_EVENTO, ID_USUARIO_PESSOA_COMENTOU) VALUES (@COMENTARIO, (SELECT ID FROM USUARIO_PESSOA_EVENTO WHERE USUARIO_PESSOA_EVENTO.ID_USUARIO_PESSOA = @ID_USUARIO AND USUARIO_PESSOA_EVENTO.ID_EVENTO = @ID_EVENTO), @ID_USUARIO_PESSOA_COMENTOU)";
        private const String SQL_DELETE_COMMENT = "DELETE FROM USUARIO_PESSOA_EVENTO_COMENTARIO WHERE IDCOMENTARIO = @IDCOMENTARIO";

        private static EventoDAO evento;

        public static EventoDAO getInstance()
        {
            if(evento == null)
            {
                evento = new EventoDAO();
            }
            return evento;
        }
        /// <summary>
        /// idUsuario = Id do usuario que receberá o comentário
        /// </summary>
        /// <param name="idEvento"></param>
        /// <param name="comentario"></param>
        /// <param name="idUsuario"></param>
        public void InserirComentarioEvento(string idEvento, string comentario, long idUsuario, long idUsuarioComentou)
        {
            using (SqlConnection conn = Conectar.getConexao()) 
            {
                conn.Open();
                SqlCommand cmd = new SqlCommand(SQL_INSERT_COMENTARIO, conn);
                cmd.Parameters.AddWithValue("@COMENTARIO", comentario);
                cmd.Parameters.AddWithValue("@ID_USUARIO", idUsuario);
                cmd.Parameters.AddWithValue("@ID_EVENTO", idEvento);
                cmd.Parameters.AddWithValue("@ID_USUARIO_PESSOA_COMENTOU", idUsuarioComentou);
                cmd.ExecuteNonQuery();
            }
        }

        public List<EventoDTO> ObterEventosByUser(string id_usuario)
        {
            List<EventoDTO> listaEventos = new List<EventoDTO>();
            EventoDTO eventoDTO = null;
            using (SqlConnection conn = Conectar.getConexao())
            {
                conn.Open();
                SqlCommand cmd = new SqlCommand(SQL_SELECT_EVENTOS_BY_USER, conn);
                cmd.Parameters.AddWithValue("@ID_USUARIO", id_usuario);
                SqlDataReader reader = cmd.ExecuteReader();
                while (reader.Read())
                {
                    eventoDTO = new EventoDTO();
                    eventoDTO.id = Convert.ToInt16(reader[0]);
                    eventoDTO.Nome = reader[1].ToString();
                    eventoDTO.Logomarca = reader[2].ToString();
                    listaEventos.Add(eventoDTO);
                    eventoDTO = null;
                }
                return listaEventos;
            }
        }

        public String inserir(EventoDTO evento)
        {
            using (SqlConnection conn = Conectar.getConexao())
            {
                SqlCommand executar_comando = new SqlCommand(SQL_INSERT, conn);
                try
                {
                    conn.Open();
                    executar_comando.Parameters.AddWithValue("@NOME", evento.Nome);
                    executar_comando.Parameters.AddWithValue("@DESCRICAO", evento.Descricao);
                    executar_comando.Parameters.AddWithValue("@LOCAL", evento.Local);
                    executar_comando.Parameters.AddWithValue("@HORARIO", evento.Horario);
                    executar_comando.Parameters.AddWithValue("@PROGRAMACAO", evento.Programacao);
                    executar_comando.Parameters.AddWithValue("@RESPONSAVEL", evento.Responsavel);
                    executar_comando.Parameters.AddWithValue("@TELEFONE", evento.Telefone);
                    executar_comando.Parameters.AddWithValue("@EMAIL", evento.Email);
                    executar_comando.Parameters.AddWithValue("@SITE", evento.Site);
                    executar_comando.Parameters.AddWithValue("@LOGOMARCA", evento.Logomarca);
                    executar_comando.Parameters.AddWithValue("@VALOR", evento.Valor);
                    executar_comando.Parameters.AddWithValue("@CLASSIFICACAO_ID", evento.Classificacao.Id_classificacao);
                    executar_comando.Parameters.AddWithValue("@CATEGORIA_ID", evento.Categoria.Id_categoria);
                    executar_comando.Parameters.AddWithValue("@GENERO_ID", evento.Genero.Id_genero);
                    executar_comando.Parameters.AddWithValue("@STATUS_ID", evento.Status.Id_status);
                    executar_comando.Parameters.AddWithValue("@CIDADE_ID", evento.Cidade.Id_cidade);
                    executar_comando.Parameters.AddWithValue("@PONTUACAO_PRE", 0);
                    executar_comando.Parameters.AddWithValue("@PONTUACAO_POS", 0);
                    executar_comando.Parameters.AddWithValue("@DATA_FINAL", evento.Data_final);
                    executar_comando.Parameters.AddWithValue("@DATA_INICIO", DateTime.Now);
                    executar_comando.ExecuteNonQuery();
                    return "Inclusão realizada com sucesso";
                }
                catch (Exception o)
                {
                    return "Erro na inclusão do evento." + o.Message;
                }
            }
        }

        public int DeletarComentario(string idComentario) 
        {
            using (SqlConnection conn = Conectar.getConexao())
            {
                conn.Open();
                SqlCommand cmd = new SqlCommand(SQL_DELETE_COMMENT, conn);
                cmd.Parameters.AddWithValue("@IDCOMENTARIO", idComentario);
                try
                {
                    int qtd = cmd.ExecuteNonQuery();
                    return qtd;
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
            }
        }
    }
}
